#!/usr/bin/env python3
"""
邮件辅助函数模块
包含邮件处理相关的工具函数
"""

import time
import random
import string
from email.header import decode_header
import logging

email_logger = logging.getLogger('email_system')


def imap_utf7_encode(s: str) -> str:
    """将Unicode字符串编码为IMAP Modified UTF-7格式"""
    if not s:
        return s
    # 简化处理：ASCII字符直接返回
    try:
        s.encode('ascii')
        return s
    except UnicodeEncodeError:
        # 对于非ASCII字符，保持原样（后续可以使用imapclient库完整实现）
        return s


def imap_utf7_decode(s: str) -> str:
    """将IMAP Modified UTF-7格式解码为Unicode字符串"""
    if not s:
        return s
    
    try:
        # IMAP使用Modified UTF-7编码
        # & 开始编码，- 结束编码
        # &- 表示字面上的 &
        
        # 先处理特殊情况
        if s == '&-':
            return '&'
        
        # 如果没有编码标记，直接返回
        if '&' not in s:
            return s
        
        # 简单的解码实现（基于base64）
        import base64
        import re
        
        def decode_modified_utf7(match):
            """解码单个Modified UTF-7编码段"""
            encoded = match.group(1)
            if not encoded:  # &- 情况
                return '&'
            try:
                # Modified UTF-7使用 , 替换 /
                encoded = encoded.replace(',', '/')
                # 添加填充
                padding = (4 - len(encoded) % 4) % 4
                encoded += '=' * padding
                # Base64解码
                decoded_bytes = base64.b64decode(encoded)
                # UTF-16 BE解码
                return decoded_bytes.decode('utf-16-be')
            except Exception:
                # 解码失败，返回原始字符串
                return match.group(0)
        
        # 匹配所有 &....- 格式的编码
        result = re.sub(r'&([^-]*)-', decode_modified_utf7, s)
        return result
        
    except Exception as e:
        email_logger.warning(f"[UTF-7解码] 解码失败: {s}, 错误: {e}")
        # 解码失败，返回原字符串
        return s


def normalize_folder_name(display_name: str) -> str:
    """标准化文件夹名称为系统内部使用的名称"""
    normalized = display_name.lower()
    if normalized.startswith('/'):
        normalized = normalized[1:]
    
    # 系统文件夹映射
    folder_map = {
        'inbox': 'inbox', '收件箱': 'inbox',
        'sent': 'sent', 'sent messages': 'sent', '已发送': 'sent',
        'drafts': 'drafts', '草稿箱': 'drafts',
        'trash': 'trash', 'deleted messages': 'trash', '垃圾箱': 'trash',
        'junk': 'junk', 'spam': 'junk', '垃圾邮件': 'junk'
    }
    
    return folder_map.get(normalized, normalized)


def safe_decode_header(header_value):
    """安全解码邮件头部信息"""
    if not header_value:
        return ''
    
    try:
        # 尝试解码头部信息
        decoded_parts = decode_header(header_value)
        decoded_string = ''
        
        for part, encoding in decoded_parts:
            if isinstance(part, bytes):
                if encoding:
                    try:
                        decoded_string += part.decode(encoding)
                    except (UnicodeDecodeError, LookupError):
                        # 如果指定编码失败，尝试常见编码
                        for fallback_encoding in ['utf-8', 'gbk', 'gb2312', 'latin-1']:
                            try:
                                decoded_string += part.decode(fallback_encoding)
                                break
                            except (UnicodeDecodeError, LookupError):
                                continue
                        else:
                            # 如果所有编码都失败，使用ignore错误处理
                            decoded_string += part.decode('utf-8', errors='ignore')
                else:
                    # 没有指定编码，尝试UTF-8
                    try:
                        decoded_string += part.decode('utf-8')
                    except UnicodeDecodeError:
                        decoded_string += part.decode('utf-8', errors='ignore')
            else:
                decoded_string += str(part)
        
        return decoded_string
    except Exception as e:
        email_logger.warning(f"解码邮件头部失败: {e}")
        return str(header_value)


def generate_email_account_id():
    """生成唯一的邮箱账号 ID"""
    timestamp = int(time.time() * 1000)
    random_str = ''.join(random.choices(string.ascii_lowercase + string.digits, k=9))
    return f"email-{timestamp}-{random_str}"

